//4.身份验证
const Keycloak = require("keycloak-connect");
const session = require("express-session");

const setupAuth = (app, routes) => {
  // 创建内存存储实例，用于存储会话数据
  // 注意：生产环境建议使用Redis或数据库存储
  var memoryStore = new session.MemoryStore();

  // 创建Keycloak实例，配置使用内存存储
  var keycloak = new Keycloak({ store: memoryStore });

  // 配置Express会话中间件
  app.use(
    session({
      secret: "<RANDOM GENERATED TOKEN>", // 会话密钥，用于签名会话ID
      resave: false, // 强制保存会话，即使会话没有被修改
      saveUninitialized: true, // 强制将未初始化的会话存储到存储中
      store: memoryStore, // 使用内存存储来保存会话数据
    })
  );

  // 注册Keycloak中间件，处理身份验证逻辑
  app.use(keycloak.middleware());

  // 遍历路由配置，为需要身份验证的路由添加保护
  routes.forEach((r) => {
    if (r.auth) {
      // 为需要身份验证的路由添加Keycloak保护中间件
      app.use(r.url, keycloak.protect(), function (req, res, next) {
        next(); // 如果身份验证通过，继续执行下一个中间件
      });
    }
  });
};

exports.setupAuth = setupAuth;
